Daten aus ALV ermitteln

Vor einem Jahrzehnt habe ich den Post Exporting ALV to Memory2 veröffentlicht, in dem ich bei meinen Recherchen zu Mendocino darauf gestoßen bin, wie man Daten aus einem Report zurück bekommen kann, der die diese per ALV anzeigt.

Heute brauchte ich diesen Trick, um im SD-Bonusmanagement die Daten abzugreifen, die der Baustein WB2R_PRINT_BUSINESS_VOLUME ermittelt. Der Baustein liest alle Daten, die ich benötige. Leider ruft er am Ende einen ALV auf, so dass ich den Baustein nicht ohne weiteres verwenden kann.

Nachdem ich sichergestellt habe, dass ich die Daten wie gewünscht lesen kann, ist mir aufgefallen, dass die Daten so zurückkommen, wie sie im verwendeten Layout definiert waren. Um auf Layoutänderungen gefasst zu sein, begab ich mich auf die Suche danach, wie ich es umgehen kann, dass das Default-Layout verwendet wird. Hier bin ich leider nicht fündig geworden. Allerdings habe ich etwas viel besseres gefunden: Den Community-Blog-Post Get ALV data in background ( cl_salv_bs_runtime_info ) von jorg_vdst.

In diesem Post beschreibt jorg_vdst einen simplen Weg, wie man an alle Daten des ALV herankommt:

" prepare
cl_salv_bs_runtime_info=>set(
  display  = abap_false
  metadata = abap_false
  data     = abap_true ).

" Call program or function mondule that calls ALV
CALL FUNCTION 'WB2R_PRINT_BUSINESS_VOLUME'
  EXPORTING
    iv_output_level               = p_level
    iv_bvb_data_type              = p_bvb
    iv_maxout                     = p_maxout
    iv_without_db_authority_check = abap_true
    it_contracts                  = contracts.

" Get ALV data
FIELD-SYMBOLS <DATA> TYPE ANY TABLE.
TRY.
    cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_data ).
    ASSIGN lr_data->* TO <data>.
  CATCH cx_salv_bs_sc_runtime_info.
    MESSAGE 'Unable to retrieve ALV data' TYPE 'E'.
ENDTRY.
 
cl_salv_bs_runtime_info=>clear_all( ).

Das Schöne hier bei ist, dass man wirklich alle Daten bekommt, die dem ALV übergeben wurden. Zusätzlich kann man der Methode CL_SALV_BS_RUNTIME_INFO=>SET auf mitgeben, dass die Daten vorher trotzdem angezeigt werden sollen. Der Parameter METADATA muss gesetzt werden, wenn man später mit CL_SALV_BS_RUNTIME_INFO=>GET_METADATA die Metadaten des ALV ermitteln möchte. In den Metadaten ist der Feldkatalog enthalten.

Was leider nicht funktionierte: Als ich den Parameter DISPLAY auf TRUE gesetzt habe, um die Daten anzeigen zulassen, habe ich die Sortierung, Filter und Feldkatalog geändert. Meine Erwartung war, dass ich diese Änderung in den Metadaten sehe. Leider war das nicht der Fall.

Auf jeden Fall ist die Lösung mit CL_SALV_BS_RUNTIME_INFO eine saubere Variante, um an die Daten eines ALV heranzukommen. Das aufgerufene Programm oder Funktionsbaustein darf natürlich keine anderen Dynpros aufrufen. Diese werden nicht unterdrückt.

Enno Wulff
Letzte Artikel von Enno Wulff (Alle anzeigen)